import pygame
from .. import tools, setup
from .. import constants as C


# 金币闪烁类(继承自pygame.sprite.Sprite类)
class FlashingCoin(pygame.sprite.Sprite):  # class 新类(旧类):类的继承
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)  # 同上,方法的继承
        self.frames = []
        self.frame_index = 0
        # 列表每个元素都是一个元组,存放四个明暗程度不同的金币坐标和宽高值方便后面截取金币图样
        # 根据实际测得的item~.png里忽明忽暗四个金币截取要对应的坐标和宽高
        frame_rects = [(1, 160, 5, 8), (9, 160, 5, 8),
                       (17, 160, 5, 8), (9, 160, 5, 8)]
        self.load_frames(frame_rects)  # 不同状态金币载入方法
        self.image = self.frames[self.frame_index]  # 从金币图片列表按索引取出图片
        self.rect = self.image.get_rect()  # 定义矩形变量以确定金币放置位置
        self.rect.x = 280
        self.rect.y = 58
        self.timer = 0  # 定义timer变量实现计时器作用

    def load_frames(self, frame_rects):
        sheet = setup.GRAPHICS['item_objects']
        for frame_rect in frame_rects:
            # for循环调用tools.get_image()方法截取四个元组相应信息的金币图片并存入对应列表;
            # 注:*frame_react:解包操作,将frame_react变量得到的元组内四个元素转换为四个变量
            self.frames.append(tools.get_image(sheet, *frame_rect, (0, 0, 0), C.BG_MULTI))

    # 重写父类update方法以实现金币闪烁效果
    def update(self):
        self.current_time = pygame.time.get_ticks()  # 定义变量current_time获取当前系统时间
        frame_durations = [375, 125, 125, 125]  # 定义frame_durations列表存放四个状态的金币停留时间

        # 判断如果timer初始状态为0，将其调为当前时间
        if self.timer == 0:
            self.timer = self.current_time
        # 否则如果当前时间减去计时器时间大于当前金币状态索引对应停留时间
        # 将索引+1,同时对4取余,以处理索引3+1=4应当重置为0的情况
        # 同时将计时器更新为当前系统时间以便后续对照
        elif self.current_time - self.timer > frame_durations[self.frame_index]:
            self.frame_index += 1
            self.frame_index %= 4
            self.timer = self.current_time

        # 每次更新最后一步都重新根据索引取出对应的图片以达到闪烁的效果
        self.image = self.frames[self.frame_index]
